#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <net/if.h>
#include <net/route.h>
#include <sys/ioctl.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>

int main(int argc, char const *argv[])
{
    char *if_name = "ens33"; // 指定网卡名称
    int metric = 200; // 指定要设置的metric值

    // 创建socket
    int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock_fd < 0) {
        perror("socket");
        exit(1);
    }

    // 获取网卡的IP地址和netmask
    struct ifreq ifr;
    memset(&ifr, 0, sizeof(ifr));
    strncpy(ifr.ifr_name, if_name, IFNAMSIZ - 1);
    if (ioctl(sock_fd, SIOCGIFADDR, &ifr) < 0) {
        perror("ioctl");
        exit(1);
    }
    struct sockaddr_in *addr = (struct sockaddr_in *)&ifr.ifr_addr;
    struct in_addr ip_addr = addr->sin_addr;

    memset(&ifr, 0, sizeof(ifr));
    strncpy(ifr.ifr_name, if_name, IFNAMSIZ - 1);
    if (ioctl(sock_fd, SIOCGIFNETMASK, &ifr) < 0) {
        perror("ioctl");
        exit(1);
    }
    struct sockaddr_in *netmask = (struct sockaddr_in *)&ifr.ifr_addr;
    struct in_addr netmask_addr = netmask->sin_addr;

    // 获取默认路由
    // struct rtentry rt;
    // memset(&rt, 0, sizeof(rt));
    // rt.rt_dst.sa_family = AF_INET;
    // rt.rt_genmask.sa_family = AF_INET;
    // rt.rt_flags = RTF_UP;
    // rt.rt_dev = (char *)if_name;
    // if (ioctl(sock_fd,  SIOCGETRT, &rt) < 0) {
    //     perror("ioctl");
    //     exit(1);
    // }

    // // 修改metric值
   // rt.rt_metric = metric;

    // 更新路由表
    // if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
    //     perror("ioctl");
    //     exit(1);
    // }

        // 获取接口的索引
    memset(&ifr, 0, sizeof(ifr));
    strncpy(ifr.ifr_name, if_name, IFNAMSIZ - 1);
    if (ioctl(sock_fd, SIOCGIFINDEX, &ifr) < 0) {
        perror("ioctl(SIOCGIFINDEX)");
        close(sock_fd);
        exit(EXIT_FAILURE);
    }
    int ifindex = ifr.ifr_ifindex;

    // 设置接口的 metric
    ifr.ifr_metric = metric;
    if (ioctl(sock_fd, SIOCSIFMETRIC, &ifr) < 0) {
        perror("ioctl(SIOCSIFMETRIC)");
        close(sock_fd);
        exit(EXIT_FAILURE);
    }

   // printf("Successfully modified metric for %s(MISSING): %d(MISSING)\n", inet_ntoa(ip_addr), rt.rt_metric);

    close(sock_fd);

    return 0;
}